package spese.gestore.androidiani;

import java.util.Calendar;

import spese.gestore.androidiani.ListViewDb.ListViewMetaData;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.os.Vibrator;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

/**
 * Questa classe permette all'utente di interfacciarsi col programma per poter creare una nuova missione
 * @author Fusinato Lorenzo - Androidiani
 *
 */
public class Nuova_Missione extends Activity {

	public Calendar cal = Calendar.getInstance();
	private int sYear;
	private int sMonth;
	private int sDay;
	private int eYear;
	private int eMonth;
	private int eDay;
	private String sDate;
	private String eDate;
	public int num_dialog=2;
	public SimpleCursorAdapter adapter_list_view;
	public ListViewDb listdb;
	public MissioniDb db;
	public ListView lV_new_miss;
	public Cursor curs_list_view;
	public String new_mission_name="";
	public String new_mission_place="";
	public String bool;
    
    protected void onCreate (Bundle b){
		super.onCreate(b);
		setContentView(R.layout.layout_nuova_missione);
		
		db = new MissioniDb(getApplicationContext());
        db.open();
		
		bool = "";
		
		Intent intent = getIntent();

		bool = intent.getStringExtra("Bool");
        
	    final Button button_save = (Button) findViewById(R.id.save_new_mission);
	    
	    final Toast toast_no_name=Toast.makeText(this,"Name's field is required",Toast.LENGTH_LONG);
	    
	    final Toast toast_no_place=Toast.makeText(this,"Place's field is required",Toast.LENGTH_LONG);
	   
	    final MediaPlayer mpAlert = MediaPlayer.create(this, R.raw.alert);
	    
	    final Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
		
		//Implemento La list View
		lV_new_miss = (ListView) findViewById(R.id.lV_nuovamissione);
		
		//Apriamo il db creato tramite MissioniDb a cui passo il contesto della classe attuale ovvero Lista_Missioni
        listdb=new ListViewDb(getApplicationContext());
        
        //apriamo il db
        listdb.open(); 
        
        //Popolo il db se è vuoto
        if(listdb.fetchListView().getCount()==0){
        	popolaListViewDB();
        }
        
        sYear = cal.get(Calendar.YEAR);
		sMonth = cal.get(Calendar.MONTH);
		sDay = cal.get(Calendar.DAY_OF_MONTH);
		eYear = cal.get(Calendar.YEAR);
		eMonth = cal.get(Calendar.MONTH);
		eDay = cal.get(Calendar.DAY_OF_MONTH);
		
		StringBuilder sDataB = new StringBuilder().append(sDay).append("/").append(sMonth + 1).append("/").append(sYear);
        sDate=sDataB.toString();
        
        StringBuilder eDataB = new StringBuilder().append(sDay).append("/").append(sMonth + 1).append("/").append(sYear);
        eDate=eDataB.toString();

        if(!bool.equalsIgnoreCase("a")){
        	new_mission_name = db.getRecord(bool, 1);
        	new_mission_place = db.getRecord(bool, 2);
        	sDate = db.getRecord(bool, 3);
        	eDate = db.getRecord(bool, 4);
        	
        	listdb.update("1","Insert Mission",new_mission_name,"1");
       	 	listdb.update("2","Insert Place",new_mission_place,"1");
       	    listdb.update("3","Insert Start Date",sDate,"1");
    	 	listdb.update("4","Insert End Date",eDate,"1");
        }
		
        listdb.update("3","Insert Start Date",sDate,"1");
   	 	listdb.update("4","Insert End Date",eDate,"1");
        
        //Chiamo la Query che in questo caso è un all
        curs_list_view=listdb.fetchListViewByActivity("1");
        
        //Comincio a fare il management del cursore
        startManagingCursor(curs_list_view);
     
        //Semplice cursor adapter
        adapter_list_view=new SimpleCursorAdapter(
                        this, //Contesto
                        R.layout.row_new_miss, //il layout di ogni riga/prodotto
                        curs_list_view, //Il cursore
                        new String[]{ListViewDb.ListViewMetaData.LIST_VIEW_HEADER_KEY,ListViewDb.ListViewMetaData.LIST_VIEW_FOOTER_KEY},//questi colonne
                        new int[]{R.id.tV_header_miss,R.id.tV_footer_miss});//in queste views
       
        //Ora la list view si prende questo adapter appena creato sopra
        lV_new_miss.setAdapter(adapter_list_view);
		
	    lV_new_miss.setOnItemClickListener(new OnItemClickListener() {
		    public void onItemClick(AdapterView<?> parent, View v,int position, long id) {  
		    	showDialog((int) id);
		}
		});
	    
	    button_save.setOnClickListener(new View.OnClickListener(){
			public void onClick(View v){
				
				System.out.println(sDate+" "+eDate);
				
				if (new_mission_name.length()==0) {toast_no_name.show();
												   mpAlert.start();
												   vib.vibrate(300);
												   return ;}
				
				if (new_mission_place.length()==0) {toast_no_place.show();
				   									mpAlert.start();
				   									vib.vibrate(300);
				   									return ;}
				
				if(controllo_data()==0){return;}
				
				else {
					if(!bool.equalsIgnoreCase("a")){
						db.update(bool,new_mission_name,new_mission_place,sDate,eDate);
						//Faccio l'update dei dati a come erano prima di essere modificati.
						 listdb.update("1","Insert Mission","ex: Engeenering Meeting","1");
						 listdb.update("2","Insert Place","ex: Berlino","1");
						 listdb.update("3","Insert Start Date","ex: 20/04/2012","1");
			        	 listdb.update("4","Insert End Date","ex: 21/05/2012","1");
			        	 
					     //Chiudo il list view db
			             listdb.close();
			             
						 Intent intent=new Intent (Nuova_Missione.this,Lista_Missioni.class);
						 startActivity(intent);
					
						 System.out.println("Button_do");
					}
					
					else{db.insertMission(new_mission_name,new_mission_place,sDate,eDate);
				
				     //Faccio l'update dei dati a come erano prima di essere modificati.
					 listdb.update("1","Insert Mission","ex: Engeenering Meeting","1");
					 listdb.update("2","Insert Place","ex: Berlino","1");
					 listdb.update("3","Insert Start Date","ex: 20/04/2012","1");
		        	 listdb.update("4","Insert End Date","ex: 21/05/2012","1");
		        	 
				     //Chiudo il list view db
		             listdb.close();
		             
					 Intent intent=new Intent (Nuova_Missione.this,Lista_Missioni.class);
					 startActivity(intent);
				
					 System.out.println("Button_do");}}
				
				}
		});
    }
    
    /**
	 * Metodo per riordinare i db quando chiudo l'activity
	 * 
	 * @see android.app.Activity#onDestroy()
	 */
	protected void onDestroy() {
		listdb.close();
		db.close();
	}
    
	public int controllo_data() {
	
		final Toast toast_date_minor=Toast.makeText(this,"The date of arrival must be greater than that of the starting",Toast.LENGTH_LONG);
		   
	    final MediaPlayer mpAlert = MediaPlayer.create(this, R.raw.alert);
	    
	    final Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
		
		if (sYear>eYear){toast_date_minor.show();
		   				 mpAlert.start();
		   				 vib.vibrate(300);
		   				 return 0;}
		
		if ((sYear==eYear) && (sMonth>eMonth)) {toast_date_minor.show();
			 							        mpAlert.start();
			 							        vib.vibrate(300);
			 							        return 0;}
		
		if (sYear==eYear && sMonth==eMonth && sDay>eDay){toast_date_minor.show();
			 										   mpAlert.start();
			 										   vib.vibrate(300);
			 										   return 0;}
		
		else return 1;
	}
	
    /**
     * Fare l'update dell'interfaccia con la nuova Start Date
     */
    protected void updateSdate() {
        
        StringBuilder sData = new StringBuilder().append(sDay).append("/").append(sMonth + 1).append("/").append(sYear);
        String new_sdata=sData.toString();
        
        ContentValues v = new ContentValues();    
        
        v.put(ListViewMetaData.LIST_VIEW_FOOTER_KEY, new_sdata);
       
        listdb.update("3","Insert Start Date",new_sdata,"1");
        
        curs_list_view.requery();
        
        //adapter_list_view.notifyDataSetChanged();
        
    }

    /**
     * Fare l'update dell'interfaccia con la nuova End Date
     */
    protected void updateEdate() {
   
        StringBuilder eData = new StringBuilder().append(eDay).append("/").append(eMonth + 1).append("/").append(eYear);
        String new_edata=eData.toString();
        
        ContentValues v = new ContentValues();    
        
        v.put(ListViewMetaData.LIST_VIEW_FOOTER_KEY, new_edata);
       
        listdb.update("4","Insert End Date",new_edata,"1");
        
        curs_list_view.requery();
    }
    
    /**
     * Con questo metodo impongo al device che al tasto "back" faccia quello voglio io
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        	listdb.update("1","Insert Mission","ex: Engeenering Meeting","1");
			listdb.update("2","Insert Place","ex: Berlino","1");
        	listdb.update("3","Insert Start Date","ex: 20/04/2012","1");
        	listdb.update("4","Insert End Date","ex: 21/05/2012","1");
        	listdb.close();
        	Intent intent=new Intent (Nuova_Missione.this,Lista_Missioni.class);
			startActivity(intent);
            return false;
        }
        return super.onKeyDown(keyCode, event);
    }
    
    /**
     * Questo metodo mi permettere di di fare lo switch dei 2 datepicker in base al pulsante premuto.
     * @see android.app.Activity#onCreateDialog(int)
     */
    protected Dialog onCreateDialog(int id) {
    	
    	switch(id){
    	case 1: {getMission();};
    	break;
    	case 2: {getPlace();};
    	break;
    	case 3: return new DatePickerDialog(this,
                sDateSetListener,
                sYear, sMonth, sDay);
    	case 4: return new DatePickerDialog(this,
                eDateSetListener,
                eYear, eMonth, eDay);
    	}
		return null;
}
    
    /**
     * Questo metodo serve per prendere il nome dell missione tramite un EditText presente in un alert dialog
     * @return 
     */
    public void getMission(){
    	
    			//Creo l'alert Dialog
    			AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);
    			
    			//Setto il titolo del mio alert
    	        miaAlert.setTitle("Insert Mission");
    	        
    	        final EditText input = new EditText(this); 
    	        miaAlert.setView(input);

    	        miaAlert.setCancelable(false);
    	        
    	        //Setto l'azione da intraprendere quando viene dato l'ok dall'utente
    	        miaAlert.setPositiveButton("Save", new DialogInterface.OnClickListener() {
    	          public void onClick(DialogInterface dialog, int id) {
    	        	
    	        	  new_mission_name=input.getText().toString();
    	        	  
    	              listdb.update("1","Insert Mission",new_mission_name,"1");
    	              
    	              curs_list_view.requery();
    	        	  return;
    	      	    
    	          }
    	        });
    	            
    	        //Setto l'azione da intraprendere quando viene dato il "no" dall'utente
    	        miaAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    	          public void onClick(DialogInterface dialog, int id) {
    	            return;   		
    	          }
    	        });
    	        
    	        //Ora istanzio il mio alert
    	        AlertDialog alert = miaAlert.create();
    	        
    	        //Ora visualizzo il mio alert appena istanziato
    	        alert.show();

    }
    
    /**
     * Questo metodo serve per prendere il posto dell missione tramite un EditText presente in un alert dialog
     */
    public void getPlace(){
    	
    	//Creo l'alert Dialog
		AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);
		
		//Setto il titolo del mio alert
        miaAlert.setTitle("Insert Place");
        
        final EditText input_2 = new EditText(this); 
        miaAlert.setView(input_2);

        miaAlert.setCancelable(false);
        
        //Setto l'azione da intraprendere quando viene dato l'ok dall'utente
        miaAlert.setPositiveButton("Save", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
        	
        	  new_mission_place=input_2.getText().toString();
        	  
              listdb.update("2","Insert Place",new_mission_place,"1");
              
              curs_list_view.requery();
        	  return;
      	    
          }
        });
            
        //Setto l'azione da intraprendere quando viene dato il "no" dall'utente
        miaAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
            return;   		
          }
        });
        
        //Ora istanzio il mio alert
        AlertDialog alert = miaAlert.create();
        
        //Ora visualizzo il mio alert appena istanziato
        alert.show();
    }
    
    /**
     * Metodo che appena do l'ok prende la data e la manipola per inserirla nella stringa sDate
     */
    protected DatePickerDialog.OnDateSetListener sDateSetListener =
        new DatePickerDialog.OnDateSetListener() {
            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                sYear = year;
                sMonth = monthOfYear;
                sDay = dayOfMonth;
                StringBuilder sData_unita = new StringBuilder().append(sDay).append("/").append(sMonth + 1)
 	     			   .append("/").append(sYear);
 	            
                sDate=sData_unita.toString();
                updateSdate();
            }
    };
    
    /**
     * Metodo che appena do l'ok prende la data e la manipola per inserirla nella stringa eDate
     */
    protected DatePickerDialog.OnDateSetListener eDateSetListener =
            new DatePickerDialog.OnDateSetListener() {
                public void onDateSet(DatePicker view, int year, 
                                      int monthOfYear, int dayOfMonth) {
                    eYear = year;
                    eMonth = monthOfYear;
                    eDay = dayOfMonth;
                    StringBuilder eData_unita = new StringBuilder().append(eDay).append("/").append(eMonth + 1)
		    	 			   .append("/").append(eYear);
		    	        
                    eDate=eData_unita.toString();
                    updateEdate();
                }
        };
        
    /**
     * Popolo il DB List View se questo è vuoto, ossia nel caso di un primo avvio dell'app.
     */
    public void popolaListViewDB(){
        	listdb.insertListView("Insert Mission","ex: Engeenering Meeting","1");
        	listdb.insertListView("Insert Place","ex: Berlino","1");
        	listdb.insertListView("Insert Start Date","ex: 20/04/2012","1");
        	listdb.insertListView("Insert End Date","ex: 21/05/2012","1");
        	listdb.insertListView("Place", "ex:Berlino", "2");
        	listdb.insertListView("Insert Date", "", "2");
        	listdb.insertListView("Category", "", "2");
        	listdb.insertListView("Valuta", "", "3");
        	listdb.insertListView("Person", "", "3");
        	listdb.insertListView("Price", "", "3");
        	listdb.insertListView("Photo", "", "3");
        }
        
}